/*
  命名空间 与 命名空间模块化
    命名空间在其他语言中已经是一个很常见的功能了  c# java php都有命名空间的 

    过去JS是不存在命名空间的  在TS里面 实现了命名空间  但实际的原理还是通过立即执行函数（自执行函数） - 因为函数有块作用域

*/

// TS使用 namespace 空间名{} 的形式来定义命名空间  命名空间下的数据放在大括号里面
namespace space1 {
  let sname: string = 'Jimmy'
  export function showa(): void {
    //要想在外界使用命名空间里面的数据 需要将空间里面的数据导出
    console.log(sname)
  }
}

namespace space2 {
  let sname: string = 'xuexue'
  export function showa(): void {
    console.log(sname)
  }
}

space2.showa() //  xuexue
space1.showa() //  Jimmy

/*
  使用 export 导出数据
*/

/*
  模块化知识点复习：
    export 和 export default 区别
      export default 只能导出一次  （所以是需要将要导出的数据一起放在一个对象里面 统一导出）

      export 可以分多次导出  默认的也会将分多次导出的数据整合成一个对象的形式导出

  TS中的模块化的导出导出 和 ES6 的模块化导入导出基本是一致的 
*/

/*
  命名空间和模块化的异同
    相同点： 
      都可以实现变量名‘重复定义’ 
    不同点：
      命名空间：内部模块，主要是用于组织代码，避免命名冲突
      模块：  TS的外部模块检测，  主要侧重的是代码的复用，一个模块里可以有多个命名空间
*/
